local util = require("util")


-- 元表
metaTable = {name = 'haha',age = 3,which=321}

tab = {name = 'xiao'}
setmetatable(tab,{__index = metaTable})

-- 1. 设置元表，__index指向的对象为替代寻找
print(tab.name)
print(tab.age)
tab.name = nil
-- tab 中name设为nil后，访问的是metaTable中的
print(tab.name)


-- 2. 使用 __newindex ,为一个{}时，添加新元素实际是到那里面
meta = {}
tab = setmetatable(
		{name="xiaoz"},
		{__newindex = meta}
	)
print(tab.name)

tab.age = 100  -- 增加新的元素 是添加到了meta 这个表中了
print(tab.age,meta.age)

tab.name = "woqu"
-- 对老元素的修改，是直接修改表中的值
print(tab.name,meta.name)

-- rawset 在不触发任何元方法的情况下 修改或添加 元素
rawset(tab,"name","tian")
rawset(tab,"age",12)
rawset(tab,"woqu",15)
util.seeTable(tab)

-- 3. 使用 __newindex 元方法 和 __index 
setmetatable( tab,
	{
		__newindex = function(tab, key, value)
			print("添加key, " .. key ..":".. value)
			rawset(tab, key, "#"..value.."#")
		end,
		__index = metaTable,
	}
)

tab.nick = "nimei"
util.seeTable(tab)
print(tab.which)

